﻿using System;
using System.Collections.Generic;
using System.Collections;
using System.Linq;
using System.Web;
using System.Globalization;
using System.Data;
using System.IO;
using System.Net;

/// <summary>
/// Summary description for Utility
/// </summary>
public class Utility
{
    public Utility()
    {
        //
        // TODO: Add constructor logic here
        //
    }

    public static DateTime FirstDateOfWeek(int year, int weekOfYear, int offset)
    {
        DateTime jan1 = new DateTime(year, 1, 1);
        int daysOffset = (int)CultureInfo.CurrentCulture.DateTimeFormat.FirstDayOfWeek + offset - (int)jan1.DayOfWeek;
        DateTime firstMonday = jan1.AddDays(daysOffset);
        int firstWeek = CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(jan1, CultureInfo.CurrentCulture.DateTimeFormat.CalendarWeekRule, CultureInfo.CurrentCulture.DateTimeFormat.FirstDayOfWeek);
        if (firstWeek <= 1)
        {
            weekOfYear -= 1;
        }
        return firstMonday.AddDays(weekOfYear * 7);
    }

    public static DataTable HasgtoDataSet(Hashtable ht)
    {
        DataTable dt = new DataTable("semana");
        dt.Columns.Add("No.");
        dt.Columns.Add("Agent Name");
        dt.Columns.Add("Goal");
        dt.Columns.Add("Mon");
        dt.Columns.Add("Tue");
        dt.Columns.Add("Wed");
        dt.Columns.Add("Thu");
        dt.Columns.Add("Fri");
        dt.Columns.Add("Sat");
        dt.Columns.Add("Tot");
        dt.Columns.Add("Diff");
        int total = 0;
        int goal = 0, dif = 0;
        int contador = 1;
        try
        {

            foreach (RE_GenericBean rgb in ht.Values)
            {
                total = rgb.intC1 + rgb.intC2 + rgb.intC3 + rgb.intC4 + rgb.intC5 + rgb.intC6 + rgb.intC7;
                goal = DB.getCurrentGoal(rgb.strC1);
                dif = total - goal;
                object[] objArr = { contador, rgb.strC1, goal, rgb.intC1, rgb.intC2, rgb.intC3, rgb.intC4, rgb.intC5, rgb.intC6, total, dif };
                dt.Rows.Add(objArr);
                contador++;
            }
            dt.DefaultView.Sort = "Tot DESC";
        }
        catch (Exception e)
        {
            string ruta = "c:\\TEMP\\archivo.txt";
            StreamWriter escritor = new StreamWriter(ruta, true);
            escritor.WriteLine(e.Message.ToString());
            escritor.Close();
            return null;
        }
        return dt;
    }

    public static RE_GenericBean addTotales(DataTable dt)
    {
        RE_GenericBean result = new RE_GenericBean();
        try
        {
            foreach (DataRow dr in dt.Rows)
            {
                result.intC1 += int.Parse(dr[2].ToString());
                result.intC2 += int.Parse(dr[3].ToString());
                result.intC3 += int.Parse(dr[4].ToString());
                result.intC4 += int.Parse(dr[5].ToString());
                result.intC5 += int.Parse(dr[6].ToString());
                result.intC6 += int.Parse(dr[7].ToString());
                result.intC7 += int.Parse(dr[8].ToString());
                result.intC8 += int.Parse(dr[9].ToString());
                result.intC9 += int.Parse(dr[10].ToString());
            }
        }
        catch (Exception e)
        {
            string ruta = "c:\\TEMP\\archivo.txt";
            StreamWriter escritor = new StreamWriter(ruta, true);
            escritor.WriteLine(e.Message.ToString());
            escritor.Close();
            return null;
        }
        return result;
    }

    //para enviar al servidor de FTP
    public static void UploadStreamFTP(Stream stream, string RemotePath, string Login, string Password)
    {

        // Creo el objeto ftp

        FtpWebRequest ftp = (FtpWebRequest)FtpWebRequest.Create(RemotePath);



        // Fijo las credenciales, usuario y contraseña

        ftp.Credentials = new NetworkCredential(Login, Password);



        // Le digo que no mantenga la conexión activa al terminar.

        ftp.KeepAlive = false;



        // Indicamos que la operación es subir un archivo...

        ftp.Method = WebRequestMethods.Ftp.UploadFile;



        // … en modo binario … (podria ser como ASCII)

        ftp.UseBinary = true;



        // Indicamos la longitud total de lo que vamos a enviar.

        ftp.ContentLength = stream.Length;



        // Desactivo cualquier posible proxy http.

        // Ojo pues de saltar este paso podría usar 

        // un proxy configurado en iexplorer

        ftp.Proxy = null;



        // Si esta soportado... conexión segura

        ftp.EnableSsl = false;



        // Pongo el stream al inicio

        stream.Position = 0;



        // Configuro el buffer a 2 KBytes

        int buffLength = 2048;

        byte[] buff = new byte[buffLength];



        int contentLen;



        // obtener el stream del socket sobre el que se va a escribir.

        using (Stream strm = ftp.GetRequestStream())
        {

            // Leer del buffer 2kb cada vez

            contentLen = stream.Read(buff, 0, buffLength);



            // mientras haya datos en el buffer ….

            while (contentLen != 0)
            {

                // escribir en el stream de conexión

                //el contenido del stream del fichero

                strm.Write(buff, 0, contentLen);

                contentLen = stream.Read(buff, 0, buffLength);

            }

        }

    }



    public static int UploadFTP(string FilePath, string RemotePath, string Login, string Password)
    {
        int result = 0;
        try
        {
            using (FileStream fs = new FileStream(FilePath, FileMode.Open, FileAccess.Read, FileShare.Read))
            {

                string url = Path.Combine(RemotePath, Path.GetFileName(FilePath));



                // Creo el objeto ftp

                FtpWebRequest ftp = (FtpWebRequest)FtpWebRequest.Create(url);



                // Fijo las credenciales, usuario y contraseña

                ftp.Credentials = new NetworkCredential(Login, Password);



                // Le digo que no mantenga la conexión activa al terminar.

                ftp.KeepAlive = false;



                // Indicamos que la operación es subir un archivo...

                ftp.Method = WebRequestMethods.Ftp.UploadFile;



                // … en modo binario … (podria ser como ASCII)

                ftp.UseBinary = true;



                // Indicamos la longitud total de lo que vamos a enviar.

                ftp.ContentLength = fs.Length;



                // Desactivo cualquier posible proxy http.

                // Ojo pues de saltar este paso podría usar 

                // un proxy configurado en iexplorer

                ftp.Proxy = null;



                // Pongo el stream al inicio

                fs.Position = 0;



                // Configuro el buffer a 2 KBytes

                int buffLength = 2048;

                byte[] buff = new byte[buffLength];



                int contentLen;



                // obtener el stream del socket sobre el que se va a escribir.

                using (Stream strm = ftp.GetRequestStream())
                {

                    // Leer del buffer 2kb cada vez

                    contentLen = fs.Read(buff, 0, buffLength);



                    // mientras haya datos en el buffer ….

                    while (contentLen != 0)
                    {

                        // escribir en el stream de conexión

                        //el contenido del stream del fichero

                        strm.Write(buff, 0, contentLen);

                        contentLen = fs.Read(buff, 0, buffLength);

                    }

                }

            

            }

            result = 1;
        } catch(Exception e){

            result = 0;
        }
        return result;
    }
}